Introducción

En este documento se verán temas tales como:

  • Data wrangling
  • Paquete tidyverse
  • Paquete tidyr
  • Paquete dplyr

Data wrangling

Data wrangling básicamente es el proceso de transformar o mapear datos de una estructura inicial a un formato más conveniente para poder utilizar dichos datos. Puede entenderse como el proceso en el que se preparan datos para ser sometidos a un proceso de minería de datos, esto tanto para la creación de modelos, o bien presentar la información o resultados finales.

En esta clase nos enfocaremos en dos paquetes disponibles en R para manipular los datos, específicamente los paquetes tidyverse, tidyr y dplyr.

Objetivos del Data wrangling

Cuando se está tranformando los datos, principalmente tenemos dos objetivos:

  • Estructurar los datos de cierta forma que pueda ser utilizada por algún software en particular.
  • Presentar los datos en una forma específica que permita una más fácil lectura de la información

Evidentemente, cuando se trabaja con datos, los mismos pueden estar estructurados de múltiples formas; no obstante, dependiendo de lo que se desee, se debe configurar el set datos de una forma particular para poder ser usado. En el caso de R, el formato preferible debe seguir las siguientes características:

Cada variable es almacenada en su propia columna.

Cada observación única se almacena en una sola fila.

Cada tipo de observación (dominio del problema) es almacenado en una sola tabla.

Los datos que satisfacen esas reglas se definen como Datos Limpios o Tidy data.

Tidy data se basa en un fundamento de data science que indica que un set de datos contiene tanto valores como relaciones. En la realidad muchos de los conjuntos de datos no cumplen con las reglas mencionadas, por lo que para poder usarlos efectivamente se deben transformar.

Desde el punto de uso de R, Tidy data funciona bien porque R es un lenguaje de programación vectorizado, es decir, que las estructuras de datos están construidas como vectores, y los operadores y funciones en R están optimizados para trabajar con vectores. Puntualmente, R almacena datos tabulares como un data frame, lo cual es una lista de vectores individuales, organizados de forma tal que parecen una tabla. Cada columna en la tabla es realmente un vector de la lista.

Tidy data vs NO Tidy data

Observar los siguientes datos los cuales tratan sobre casos de enfermedad que se dieron en diferentes países.

En este caso, nótese como la variable “value” hace referencia a dos dominios distintos, realmente son dos variables, la población (population) y los números de casos (cases). Esta tabla no sigue las reglas para tidy data.

A continuación los mismos datos, con la diferencia de que estos si siguen las reglas para tidy data.

NO Tidy data

  • Obtención de los casos

[1]    745   2666  37737  80488 212258 213766

  • Promedio de casos

[1] 91276.67

  • Porcentaje de enfermos según población total.

[1] 0.00372741 0.01294466 0.02193930 0.04612363 0.01667495 0.01669488

Tidy data

  • Obtención de los casos

[1]    745   2666  37737  80488 212258 213766

  • Promedio de casos

[1] 91276.67

  • Porcentaje de enfermos según población total.

[1] 0.00372741 0.01294466 0.02193930 0.04612363 0.01667495 0.01669488

Como se puede observar sin importar si los datos son tidy o no se pueden obtener los mismos resultados, pero se vuelve más complejo la obtención de los mismos si los datos no cumplen con tidy data. Para transformar nuestros datos a tidy data vamos a utilizar 3 paquetes: tidyversem tidyr y dplyr.

tidyverse

Es una colección de paquetes R de código abierto introducidos por Hadley Wickham y su equipo que “comparten una filosofía de diseño, gramática y estructuras de datos subyacentes” de los datos ordenados.

Instalación

Paquete tidyr

Instalación del paquete tidyr

Se debe cargar el paquete tidyr

Las principales funciones que utilizaremos de este paquete son:

pivot_wider

Convierte una columna en un conjunto de columnas. A continuación se muestran los parámetros, cada uno con un ejemplo:

  • data: Tabla de datos a transformar.

  • id_cols: Conjunto de columnas que identifican cada observación. Por defecto utiliza todas las columnas, excepto aquellas que se encuentran en los parámetros names_from y values_from.

  • names_from: Describe la columna (o columnas) que se va a separar.

  • values_from: Describe la columna (o columnas) que contiene el valor.

  • names_prefix: Texto que se adiciona al inicio de todos los nombres de columna. Se utiliza particularmente cuando la columna (o columnas) en names_from solo tiene valores numéricos.

  • names_sep: Si names_from o values_from contiene multiples columnas, se utilizará este parámetro para digitar la forma en que se separan textualmente el nombre de las columnas cuando se unan.

  • values_fill: Opcional, lista en la que se le indica a cada columna en values_from el valor a utilizar en caso de exista un dato perdido.

  • values_fn: Opcional, lista en la que se le indica a cada columna en values_from la función a utilizar en caso de que existan valores duplicados, por ejemplo sumarlos (sum), promediarlos (mean), etc.

Warning: Values in `puntos` are not uniquely identified; output will contain list-cols.
* Use `values_fn = list(puntos = list)` to suppress this warning.
* Use `values_fn = list(puntos = length)` to identify where the duplicates arise
* Use `values_fn = list(puntos = summary_fun)` to summarise duplicates

pivot_longer

Se puede interpretar como la inversa de pivot_wider(). En este caso la función crea una única columna a partir de un conjunto de columnas. A continuación se muestran los parámetros, cada uno con un ejemplo:

  • data: Tabla de datos a transformar.

  • cols: Describe las columnas que se van a unir.

  • names_to: Texto que se utilizará para dar nombre a la nueva columna formada con el nombre de las columnas. Puede ser un vector de nombres si se provee el parámetro names_sep.

  • values_to: Texto que se utilizará para dar nombre a la nueva columna formada con el valor.

  • names_prefix: Texto que se eliminará en cada uno de los valores de los nombres de la nueva columna.

  • names_sep: Texto que separa el nombre de la columna en nuevas columnas.

  • names_ptypes: Permite asignar el tipo de dato que se quiere para la nueva columna formada a partir de los nombres de las columnas.

  • values_ptypes: Permite asignar el tipo de dato que se quiere para la nueva columna formada a partir del valor de las columnas.

  • values_drop_na: Si “TRUE” elimina las filas con valores NA.

separate

Convierte una columna tipo caracter en múltiples columnas por medio de una separación de los valores según algún caracter especial. A continuación se muestran los parámetros, cada uno con un ejemplo:

  • data: Tabla de datos a transformar.

  • col: Describe la columna que se va a separar.

  • into: Nombre de las nuevas columnas.

  • sep: Texto con el que se va a analizar las filas para separarlas.

  • remove: Si “TRUE”, elimina la columna original.

  • extra: Acción a tomar cuando hay una fila que tiene elementos de más. “warn” (por defecto): elimina valores extras y emite una advertencia, “drop”: elimina valores extras y “merge”: que combina los valores de más con la última fila.

Warning: Expected 2 pieces. Additional pieces discarded in 1 rows [3].

  • fill: Acción a tomar cuando hay una fila que tiene menos elementos. “warn” (por defecto): rellena con “NA” a la derecha y emite una advertencia, “right”: rellena con “NA” a la derecha y “left”: rellena con “NA” a la izquierda.

Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [3].

unite

Une un conjunto de columnas tipo caracter en una sola columna. A continuación se muestran los parámetros, cada uno con un ejemplo:

  • data: Tabla de datos.

  • col: Nombre que va a recibir la nueva columna.

  • …: Conjunto de columnas que se van a unir.

  • sep: Texto con el que se va a separar cada valor.

  • remove: Si “TRUE”, elimina la columna original.

  • na.rm: Si “TRUE”, incluye “NA” en el valor de la unión de las columnas.

Paquete dplyr

Instalación del paquete dplyr

Se debe cargar el paquete dplyr

Las principales funciones que utilizaremos de este paquete son:

rename

Se utiliza para renombrar las columnas.

select

Permite seleccionar una o varias columnas, de un set de datos dado.

filter

Filtra los datos según la o las condiciones.

mutate

Se utiliza para la creación o derivación de nuevas variables.

arrange

Ordena las filas según el valor de una columna.

group_by & summarise

Se utilizan para formar grupos y obtener métricas de dichos grupos.

Pipes (%>%)

El comando pipe (%>%) simplifica la escritura de múltiples comandos en una sola expresión. Por ejemplo:

Sin Pipes

Con pipes

Ejemplos

Ejemplo 1

Para este primer ejemplo utilizaremos los datos de tuberculosis.csv (obtenidos de 2014 World HealthvOrganization Global Tuberculosis Report) el cual contiene datos sobre casos de tuberculosis (TB) reportados entre 1995 y 2013.

Estos datos proveen información epidemiológica valiosa, pero por el formato en el que están es complicado trabajar con los mismos: contiene columnas redundantes, nombres codificados de variables, valores faltantes, etc.

El dataset se caracteriza por el sistema de codificación usado en las columnas de la 5 a la 60, las cuales contienen información de grupos de datos:

  • Las primeras tres letras de cada columna indican si la columna indica nuevos o viejos casos de TB (en este caso todos son nuevos).

  • Las siguientes dos letras indican el tipo de caso: rel (indica recaídas), ep (TB extra pulmonar), sn (casos de TB que no pueden ser diagnosticados por medio de una citología pulmonar) y sp (casos de TB que pueden ser diagnosticados por medio de una citología pulmonar).

  • La sexta letra indica el género del paciente.

  • Los números restantes describen la edad (en grupos) de los pacientes, ejemplos: 014: pacientes de 0 a 14 años. 1524: pacientes de 15 a 24 años. 65: pacientes con 65 o más años.

Se crea una nueva variable con el total de casos de tuberculosis.

Se eliminan las variables “pais” e “iso2” debido a que tienen el mismo valor que el país, se elimina la variable “es.nuevo” ya que solo presenta un único valor y no aporta información, tamién se eliminan las variables sp, sn, ep, y rel ya que se va a trabajar solo con el total de casos.

Se transforman las variables “genero” y “edad” a tipo factor.

Ejemplo 2

Para este ejemplo continuamos con los datos de tuberculosis.csv (obtenidos de 2014 World HealthvOrganization Global Tuberculosis Report) el cual contiene datos sobre casos de tuberculosis (TB) reportados entre 1995 y 2013.


Cantidad de casos por edad en mujeres en el mundo en el año 2013.


Cantidad de casos por año, para los países de México, El Salvador, España y Argentina.


Análisis de Componentes Principales, aplicando código disyuntivo completo a la variable género.